package com.agile.leetcode.gc;

/**
 * System.gc（）的理解,复写finalize方法
 *
 * @Author ChenZhangKun
 * @Date 2020/11/13 10:47
 */
public class GcTest {
    private static GcTest gcTest;

    public static void main(String[] args) throws InterruptedException {
        /** 第一次调用finalize方法，此时会自救，gcTest不会回收*/
        gcTest = new GcTest();
        gcTest = null;
        System.gc();
        Thread.sleep(5000);
        if (gcTest != null) {
            System.out.println("gcTest还活着");
        } else {
            System.out.println("gcTest已经被回收了");
        }
        /** 第二次调用finalize方法，按理说此时不会自救，gcTest已经被回收*/
        gcTest = new GcTest();
        gcTest = null;
        System.gc();
        Thread.sleep(5000);
        if (gcTest != null) {
            System.out.println("gcTest还活着");
        } else {
            System.out.println("gcTest已经被回收了");
        }
    }

    /**
     * 复写finalize方法
     * 第一次执行system.gc()时此对象不会被回收
     *
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize方法执行了");
        // 第一次自救，将其重新指向对象
        gcTest = this;
    }

}
